/**
 * 价格处理工具函数
 */

/**
 * 格式化价格显示
 * @param price - 价格
 * @param showCurrency - 是否显示货币符号
 * @returns 格式化后的价格字符串
 */
export function formatPrice(price: string | number, showCurrency: boolean = false): string {
	const numPrice = typeof price === "string" ? parseFloat(price) : price;

	// 处理无效数字
	if (isNaN(numPrice) || numPrice < 0) {
		return showCurrency ? "¥0.00" : "0.00";
	}

	// 如果价格小于0.01，显示4位小数
	if (numPrice < 0.01) {
		return showCurrency ? `${numPrice.toFixed(4)}` : numPrice.toFixed(4);
	}

	// 否则显示2位小数
	return showCurrency ? `${numPrice.toFixed(2)}` : numPrice.toFixed(2);
}

/**
 * 根据用户折扣计算价格
 * @param price - 原价
 * @param userInfo - 用户信息（包含折扣信息）
 * @param noDiscounts - 是否禁用折扣
 * @returns 计算后的价格
 */
export function calculateUserPrice(
	price: string | number,
	userInfo?: any,
	noDiscounts?: number
): number {
	const numPrice = typeof price === "string" ? parseFloat(price) : price;

	// 如果没有用户信息或禁用折扣，返回原价
	if (!userInfo || noDiscounts === 1) {
		return numPrice;
	}

	// 如果用户有折扣率且小于1，计算折扣价
	if (userInfo.discount && userInfo.discount < 1) {
		return numPrice * userInfo.discount;
	}

	return numPrice;
}

/**
 * 格式化显示用户价格（包含折扣）
 * @param price - 原价
 * @param isAuthenticated - 是否已登录
 * @param userInfo - 用户信息
 * @param noDiscounts - 是否禁用折扣
 * @returns 格式化的价格字符串
 */
export function formatUserPrice(price: any, user?: any, noDiscounts?: number): string {
	if (!user.token) {
		return "登录查看";
	}
	if (noDiscounts) {
		return formatPrice(price);
	}

	const discountedPrice = calculateUserPrice(price, user.info, noDiscounts);
	return formatPrice(discountedPrice);
}

/**
 * 获取价格显示信息（包含原价和折扣价）
 * @param price - 原价
 * @param userInfo - 用户信息
 * @param noDiscounts - 是否禁用折扣
 * @returns 价格显示对象
 */
export function getPriceDisplay(
	price: string | number,
	userInfo?: any,
	noDiscounts?: number
): {
	originalPrice: string;
	discountPrice: string;
	hasDiscount: boolean;
	saveAmount: string;
} {
	const numPrice = typeof price === "string" ? parseFloat(price) : price;
	const discountedPrice = calculateUserPrice(price, userInfo, noDiscounts);
	const hasDiscount = discountedPrice < numPrice;

	return {
		originalPrice: formatPrice(numPrice),
		discountPrice: formatPrice(discountedPrice),
		hasDiscount,
		saveAmount: hasDiscount ? formatPrice(numPrice - discountedPrice) : "0.00",
	};
}
